package com.yc.d0725;

import java.lang.annotation.*;
import java.lang.reflect.Method;

//@Session(names={"abc","123"})
// 数组属性, 只定一个元素, 可以省略花括号
@Session(names="abc")
public class 注解 {

    public static void main(String[] args) throws NoSuchMethodException {

        Class<注解> cls = 注解.class;

        Method m1 = cls.getDeclaredMethod("selectAll");
        Method m2 = cls.getDeclaredMethod("update");
        // 获取方法上指定的注解对象
        Select s = m1.getAnnotation(Select.class);
        System.out.println(s);
        System.out.println(s.value());

        Update u = m2.getAnnotation(Update.class);
        System.out.println(u);

        Class<注解子类> cls1 = 注解子类.class;

        Session ses = cls1.getAnnotation(Session.class);
        System.out.println(ses);

    }

    // @Session '@Session' not applicable to method
    @Select(value = "select * from abc")
    public void selectAll() {
    }
    @Insert(value = "insert into abc", sql = "...")
    public void insert() {
    }
    @Update("insert into abc")
    public void update() {
    }
}

class 注解子类 extends 注解 {

}

@Retention(RetentionPolicy.RUNTIME)
// 继承性
@Inherited
@Target(ElementType.TYPE)
@interface Session {
    // 数组属性
    String[] names();
}


// 保持性
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@interface Select {
    // value 属性是注解的默认属性, 在只定义该属性的情况下, 可以不写 value=
    String value();
}

// 目标注解
@Target({ElementType.METHOD, ElementType.FIELD})

@interface Insert {
    String value();
    // 有多个属性定义, 在使用注解时必须定义所有的属性
    String sql();
}

//@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@interface Update {
    String value();
    String sql() default "123";
}